package com.rabit.test;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 缓存系统
 * 
 * @author Rabit
 *
 */
public class CacheDemo {
	private Map<String, Object> cache = new HashMap<>(); // 缓存对象的容器

	public static void main(String[] args) {

	}

	private ReadWriteLock rwl = new ReentrantReadWriteLock();

	public Object getData(String key) {
		rwl.readLock().lock();//读数据先上读锁
		Object value = null;
		try {

			value = cache.get(key);
			if (value == null) { // 如果预先不存在，则去数据库查询，存在则直接给出对象
				rwl.readLock().unlock();//遇到结果不存在，去掉读锁，然后上写锁
				rwl.writeLock().lock();
				try {
					if (value==null) {
				//如果三个线程执行到上写锁以后，一个上了写锁，后面的就堵塞，等待写锁解锁以后，堵塞的两个线程会继续上写锁，继续查询，加上判断可以杜绝这种情况
						value = "aaaa";
					}
				} finally {
					rwl.writeLock().unlock();//查询结束以后将写锁去掉，加上读锁，还原之前的读锁
				}
				rwl.readLock().lock();
			}
		} finally {
			rwl.readLock().unlock();
		}

		return value;
	}
}
